//package com.nt.train.aspect;
//import com.alibaba.fastjson.JSON;
//import org.aspectj.lang.JoinPoint;
//import org.aspectj.lang.ProceedingJoinPoint;
//import org.aspectj.lang.annotation.*;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//import org.springframework.core.env.Environment;
//import org.springframework.core.env.Profiles;
//import org.springframework.stereotype.Component;
//import org.springframework.web.context.request.RequestContextHolder;
//import org.springframework.web.context.request.ServletRequestAttributes;
//
//import javax.servlet.http.HttpServletRequest;
//import java.time.LocalDate;
//import java.util.Arrays;
///**
// * AOP统一日志管理 切面类
// * @author hlf
// * @version 1.0
// * @date 2022/9/28 16:44
// */
//@Aspect
//@Component
//public class LoggingAspect {
//
//    private final Logger log = LoggerFactory.getLogger(this.getClass());
//
//    /** 换行符 */
//    private static final String LINE_SEPARATOR = System.lineSeparator();
//
//    private final Environment env;
//
//    public LoggingAspect(Environment env) {
//        this.env = env;
//    }
//
//    /**
//     * 匹配spring框架的repositories、service、rest端点的切面
//     */
//    @Pointcut("within(@org.springframework.stereotype.Repository *)" +
//            " || within(@org.springframework.stereotype.Service *)" +
//            " || within(@org.springframework.web.bind.annotation.RestController *)")
//    public void springBeanPointcut() { // 方法为空，因为这只是一个切入点，实现在通知中。
//    }
//
//    /**
//     * 匹配我们自己项目的repositories、service、rest端点的切面
//     */
//    @Pointcut("within(com.nt.train.repository..*)" +
//            " || within(com.nt.train.service..*)" +
//            " || within(com.nt.train.controller..*)")
//    public void applicationPackagePointcut() { // 方法为空，因为这只是一个切入点，实现在通知中。
//    }
//
//    /**
//     * @param joinPoint
//     * @Before：前置通知
//     * value：切入点表达式  二者加起来构建成为一个切面
//     * JoinPoint：连接点：可以理解为两个圆形的切点，从这个切点就可以获取到当前执行的目标类及方法
//     * 前置通知和后置通知的参数的都是 JoinPoint， 前置后置通知都没有返回值
//     */
//    // 表示service包下的所有类所有方法都执行该前置通知
//    @Before("execution(* com.nt.train.controller.*.*(..))")
//    //@Before("springBeanPointcut()||applicationPackagePointcut()")
//    public void before(JoinPoint joinPoint) {
//        System.out.println("========================================== Start ==========================================");
//        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder
//                .getRequestAttributes();
//        HttpServletRequest request = attributes.getRequest();
//        System.out.println("前置通知开始执行《@Before》");
//        String controllerName = joinPoint.getSignature().getDeclaringTypeName() + "."
//                + joinPoint.getSignature().getName();
//       // String controllerParam = Arrays.toString(joinPoint.getArgs());
//        String controllerUrl = request.getRequestURI();
//        String method = request.getMethod();
//        System.out.println("请求执行时间:"+ LocalDate.now());
//        System.out.println("请求执行全路径类名："+controllerName);
//        System.out.println("请求执行类型方式："+method);
//        System.out.println("请求执行路径："+controllerUrl);
//        System.out.println("请求执行方法名："+joinPoint.getSignature().getName());
//        System.out.println("请求执行传入的参数是: " + Arrays.asList(joinPoint.getArgs()));
//    }
//
//    //后置通知
//    //@After(value = "execution(* com.nt.train.controller.*.*(..))")
//    @After("springBeanPointcut()||applicationPackagePointcut()")
//    public void after(JoinPoint joinPoint) {
//        System.out.println("后置通知执行《@After》");
//        System.out.println("=========================================== End ===========================================" + LINE_SEPARATOR);
//
//    }
//
//
//    /**
//     * 记录方法抛出异常的通知
//     * @param joinPoint join point for advice
//     * @param e exception
//     */
//    @AfterThrowing(pointcut = "applicationPackagePointcut() && springBeanPointcut()", throwing = "e")
//    public void logAfterThrowing(JoinPoint joinPoint, Throwable e) { // 判断环境，dev、test or prod
//        log.error("Exception in {}.{}() with cause = {}",
//                joinPoint.getSignature().getDeclaringTypeName(),
//                joinPoint.getSignature().getName(),
//                (e.getCause() != null) ? e.getCause() : "NULL");
//
////        if (env.acceptsProfiles(Profiles.of(
////                GloablConstants.SPRING_PROFILE_DEVELOPMENT,
////                GloablConstants.SPRING_PROFILE_TEST))) {
////            log.error("Exception in {}.{}() with cause = '{}' and exception = '{}'",
////                    joinPoint.getSignature().getDeclaringTypeName(),
////                    joinPoint.getSignature().getName(),
////                    (e.getCause() != null) ? e.getCause() : "NULL", e.getMessage(),
////                    e);
////        } else {
////            log.error("Exception in {}.{}() with cause = {}",
////                    joinPoint.getSignature().getDeclaringTypeName(),
////                    joinPoint.getSignature().getName(),
////                    (e.getCause() != null) ? e.getCause() : "NULL");
////        }
//    }
//
//    /**
//     * 在方法进入和退出时记录日志的通知
//     * @param joinPoint join point for advice
//     * @return result
//     * @throws Throwable throws IllegalArgumentException
//     */
//    @Around("applicationPackagePointcut() && springBeanPointcut()")
//    public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable {
//        long startTime = System.currentTimeMillis();
//        Object result = joinPoint.proceed();
//        // 打印出参
//        System.out.println("Response Args  : " + JSON.toJSONString(result));
//        // 执行耗时
//        System.out.println("Time-Consuming :  " +(System.currentTimeMillis() - startTime)+"ms");
//        return result ;
//    }
//}
